/* Использование стандартной функции ввода/вывода printf */

#include <90s8515.h> 	// подключаем  заголовочный файл используемого
// микроконтроллера AVR
/* Перед использованием стандартных функций ввода/вывода
   подключим заголовочный файл stdio.h */
#include <stdio.h>

/* Основная функция программы */
void main(void)
{
int x=83; 			// объявляем и инициализируем десятичным
// значением целую переменную x
int y=0xA0; 		// объявляем и инициализируем шестнадцатиричным
// значением целую переменную y
float z=12.345678; 	// объявляем и инициализируем переменную
// с плавающей точкой z

/* инициализируем UART AT90s8515: разрешим передатчик,
   запретим прерывания, данные - 8 бит */
UCR=0x8;

/* Скорость передачи Baud=9600 при тактовой частоте 4MHz */
UBRR=0x19;

/* Функция printf является универсальной функцией форматных
   преобразований. Каждый знак % указывает, куда должен подставляться
   каждый из аргументов и в какой форме он должен выводиться.
   Количество % должно совпадать с количеством аргументов */

printf("%-5d ",x);
/* спецификация преобразования %-5d означает, что число x будет
   напечатано в поле шириной, по крайней мере, в пять символов
   (описатель width = 5)в десятичном виде (символ преобразования 'd').
   Если x имеет менее 5 цифр, то оно будет выровнено по левому краю
   (флаг '-'), а правая часть будет заполнена пробелами (т.к. в
   описатиле width в начале отсутствует 0).
   Таким образом, будет выведено: "83 " (три пробела) */

printf("%06d\n",x);
/* спецификация преобразования %06d\n означает, что число x будет
   напечатано в поле шириной, по крайней мере, в шесть символов
   (описатель width = 06)в десятичном виде(символ преобразования'd').
   Последовательность \n является обозначением 'символа новой строки',
   который служит указанием для перехода на терминале к левому краю
   следующей строки. Т.к. в предыдущем операторе отсутствует\n, то
   вывод будет осуществлен в той же строке, что и предыдущее значение.
   Если x имеет менее 6 цифр, то оно будет выровнено по правому краю
   (т.к. флаг отсутствует), а левая часть будет заполнена нулями (т.к.
   в описатиле width в начале стоит 0).
   Таким образом, будет выведено: "000083" */

printf("%i %i\n",x,y);
/* спецификация преобразования %i %i\n означает, что сначала будет
   выведено число x (флаги и описатель width отсутствуют) в десятичном
   виде (символ преобразования 'i'). Затем будетвыведен пробел, а
   затем число y (флаги и описатель width отсутствуют) в десятичном
   виде (символ преобразования 'i'). После этого будет осуществлен
   переход на новую строку (последовательность \n).
   Таким образом, будет выведено: "83 160", т.к. y=0xA0=160 */

printf("%d=0x%x \t",y,y);
/* спецификация преобразования %d=0x%x \t означает, что сначала будет
   выведено число y (флаги и описатель width отсутствуют) в десятичном
   виде (символ преобразования 'd'). Затем будет выведена
   последовательность "=0x", а затем число y (флаги и описатель width
   отсутствуют) в шестнадцатиричном виде символами нижнего регистра
   (символ преобразования 'x'). После этого будет выведен пробел и
   осуществлена табуляция, т.е. вывод еще нескольких пробелов
   (последовательность \t).
   Таким образом, будет выведено: "160=0xa0 " */

printf("%d=0x%X\n",y,y);
/* спецификация преобразования %d=0x%X\n означает, что сначала будет
   выведено число y (флаги и описатель width отсутствуют) в десятичном
   виде (символ преобразования 'd'). Затем будет выведена
   последовательность "=0x", а затем число y (флаги и описатель width
   отсутствуют) в шестнадцатиричном виде символами верхнего регистра
   (символ преобразования 'X'). Т.к. в предыдущем операторе
   отсутствует \n, то вывод будет осуществлен в той же строке, что и
   предыдущее значение. После этого будет осуществлен переход на новую
   строку (последовательность \n).
   Таким образом, будет выведено: "160=0xA0" */

printf("%i=0x%x\n",x,x);
/* спецификация преобразования %i=0x%x\n означает, что сначала будет
   выведено число x (флаги и описатель width отсутствуют) в десятичном
   виде (символ преобразования 'i'). Затем будет выведена
   последовательность "=0x", а затем число x (флаги и описатель width
   отсутствуют) в шестнадцатиричном виде символами нижнего регистра
   (символ преобразования 'x'). После этого будет осуществлен переход
   на новую строку (последовательность \n).
   Таким образом, будет выведено: "83=0x53", т.к. x=83=0x53 */

printf("%c\n",x);
/* спецификация преобразования %c\n означает, что будет выведено
   число x в виде символа ASCII (символ преобразования 'c'). После
   этого будет осуществлен переход на новую строку (последовательность
   \n).
   Таким образом, будет выведено: "S", т.к. десятичный код 83
   соответствует символу 'S' ASCII */

printf("%e %.1e %2.2e\n",z,z,z);
/* спецификация преобразования %e %.1e %2.2e\n означает, что сначала
   будет выведено число z (флаги и описатели width и precision
   отсутствуют) с 5 знаками (по умолчанию описатель precision = 5)
   после запятой в виде [-]d.ddddd e[-]dd (символ преобразования 'e'),
   причем будет осуществлено округление числа, т.к. в числе z после    
   запятой 6 знаков (флаги и описатели width и precision отсутствуют).
   Затем будет выведено число z с 1 знаком (описатель precision .1)
   после запятой в виде [-]d.d e[-]dd (символ преобразования 'e'),
   причем будет осуществлено округление числа. После этого будет
   выведено число z с 2 (описатель precision .2) знаками после запятой 
   в виде [-]d.dd e[-]dd (символ преобразования 'e'), причем будет
   осуществлено округление числа. Описатель width = 2 здесь не имеет
   значения, он может быть любым или отсутствовать.
   После этого будет осуществлен переход на новую строку
   (последовательность \n).
   Таким образом, будет выведено: "1.23457e1 1.2e1 1.23e" */
}
